// Copyright (c) 2009 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef NET_TOOLS_FLIP_SERVER_SM_INTERFACE_H_
#define NET_TOOLS_FLIP_SERVER_SM_INTERFACE_H_

// State Machine Interfaces

#include <stddef.h>
#include <stdint.h>

#include <string>

#include "net/tools/balsa/balsa_headers.h"

namespace net {

class EpollServer;
class SMConnectionPoolInterface;
class SMConnection;

class SMInterface {
public:
    virtual void InitSMInterface(SMInterface* sm_other_interface,
        int32_t server_idx)
        = 0;
    virtual void InitSMConnection(SMConnectionPoolInterface* connection_pool,
        SMInterface* sm_interface,
        EpollServer* epoll_server,
        int fd,
        std::string server_ip,
        std::string server_port,
        std::string remote_ip,
        bool use_ssl)
        = 0;
    virtual size_t ProcessReadInput(const char* data, size_t len) = 0;
    virtual size_t ProcessWriteInput(const char* data, size_t len) = 0;
    virtual void SetStreamID(uint32_t stream_id) = 0;
    virtual bool MessageFullyRead() const = 0;
    virtual bool Error() const = 0;
    virtual const char* ErrorAsString() const = 0;
    virtual void Reset() = 0;
    virtual void ResetForNewInterface(int32_t server_idx) = 0;
    // ResetForNewConnection is used for interfaces which control SMConnection
    // objects. When called an interface may put its connection object into
    // a reusable instance pool. Currently this is what the HttpSM interface
    // does.
    virtual void ResetForNewConnection() = 0;
    virtual void Cleanup() = 0;

    virtual int PostAcceptHook() = 0;

    virtual void NewStream(uint32_t stream_id,
        uint32_t priority,
        const std::string& filename)
        = 0;
    virtual void SendEOF(uint32_t stream_id) = 0;
    virtual void SendErrorNotFound(uint32_t stream_id) = 0;
    virtual size_t SendSynStream(uint32_t stream_id,
        const BalsaHeaders& headers)
        = 0;
    virtual size_t SendSynReply(uint32_t stream_id,
        const BalsaHeaders& headers)
        = 0;
    virtual void SendDataFrame(uint32_t stream_id,
        const char* data,
        int64_t len,
        uint32_t flags,
        bool compress)
        = 0;
    virtual void GetOutput() = 0;
    virtual void set_is_request() = 0;

    virtual ~SMInterface() { }
};

class SMConnectionInterface {
public:
    virtual ~SMConnectionInterface() { }
    virtual void ReadyToSend() = 0;
    virtual EpollServer* epoll_server() = 0;
};

class SMConnectionPoolInterface {
public:
    virtual ~SMConnectionPoolInterface() { }
    virtual void SMConnectionDone(SMConnection* connection) = 0;
};

} // namespace net

#endif // NET_TOOLS_FLIP_SERVER_SM_INTERFACE_H_
